Juju上部署入门

译者:王乐 校对:无

Juju使通过配置部署Kubernetes,在集群中安装和配置所有系统更加简单。可通过一个命令增加集群尺寸来简单的扩展集群

内容列表

部署需求

注意:如果你运行kube-up,在Ubuntu上——所有的依赖会为您处理。你可以跳转到这个部分:运行Kubernetes集群

Ubuntu上部署

在您的本地Ubuntu系统安装Juju客户端。

sudo add-apt-repository ppa:juju/stable
sudo apt-get update
sudo apt-get install juju-core juju-quickstart

Docker相关部署

如果您不使用Ubuntu,而是使用Docker,您可以运行以下命令:

mkdir ~/.juju
sudo docker run -v ~/.juju:/home/ubuntu/.juju -ti jujusolutions/jujubox:latest

此时你可以在当前路径上获取juju quickstart命令。

为您所选择允许的云设置证书:

juju quickstart --constraints="mem=3.75G" -i

这里constraints flag是可选的,当请求一个新的虚拟机时,他改变Juju生成的虚拟机尺寸。大的虚拟机相比小虚拟机运行的更快,但是花费更多。

根据对话选择saveuse。快速入门将启动Juju跟节点,根据用户接口设置Juju页面。

运行Kubernetes集群

启动集群之前需要导出环境变量KUBERNETES_PROVIDER

export KUBERNETES_PROVIDER=juju
cluster/kube-up.sh

如果这是第一次运行kube-up.sh脚本,它会安装Juju部署入门的所有依赖关系,另外它会根据通用配置运行一个窗口,允许你选择云服务商,输入适当的访问凭证。

下一步它会部署kubernetes master,etcd,2个带有flannel的nodes,flannel是基础软件定义网络(SDN),它可以使在不同的主机上的容器互相通信。

检测集群

juju status命令提供了集群中每个单元的信息:

$ juju status --format=oneline
- docker/0: 52.4.92.78 (started)
  - flannel-docker/0: 52.4.92.78 (started)
  - kubernetes/0: 52.4.92.78 (started)
- docker/1: 52.6.104.142 (started)
  - flannel-docker/1: 52.6.104.142 (started)
  - kubernetes/1: 52.6.104.142 (started)
- etcd/0: 52.5.216.210 (started) 4001/tcp
- juju-gui/0: 52.5.205.174 (started) 80/tcp, 443/tcp
- kubernetes-master/0: 52.6.19.238 (started) 8080/tcp

你可 以使用juju ssh去访问任何一个单元:

juju ssh kubernetes-master/0

运行多个容器!

在Kubernetes主节点kubectl是可用的。我们ssh登录去运行一些容器,但也可以通过设置KUBERNETES_MASTER为“kubernetes-master/0”的ip地址来使用本地kubectl

在启动一个容器前无pods可获取

kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE

kubectl get replicationcontrollers
CONTROLLER  CONTAINER(S)  IMAGE(S)  SELECTOR  REPLICAS

我们将跟随aws-coreos实例。创建一个pod清单:pod.json

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "hello",
    "labels": {
      "name": "hello",
      "environment": "testing"
    }
  },
  "spec": {
    "containers": [{
      "name": "hello",
      "image": "quay.io/kelseyhightower/hello",
      "ports": [{
        "containerPort": 80,
        "hostPort": 80
      }]
    }]
  }
}

使用kubectl创建pod:

kubectl create -f pod.json

获取pod信息:

kubectl get pods

测试hello应用,我们需要定位容器所在的节点。使用Juju去作用于容器的更好的工具是在工作节点上,但是我们可以使用juju runjuju status去找到我们的hello应用。

juju run --unit kubernetes/0 "docker ps -n=1"
...
juju run --unit kubernetes/1 "docker ps -n=1"
CONTAINER ID        IMAGE                                  COMMAND             CREATED             STATUS              PORTS               NAMES
02beb61339d8        quay.io/kelseyhightower/hello:latest   /hello              About an hour ago   Up About an hour                        k8s_hello....

我们看到“kubernetes/1”有我们的容器,我们可以打开80端口:

juju run --unit kubernetes/1 "open-port 80"
juju expose kubernetes
sudo apt-get install curl
curl $(juju status --format=oneline kubernetes/1 | cut -d' ' -f3)

最后删除pod:

juju ssh kubernetes-master/0
kubectl delete pods hello

扩展集群

我们可以想这样增加节点单元:

juju add-unit docker # creates unit docker/2, kubernetes/2, docker-flannel/2

运行“k8petsore”示例应用

k8petstore示例可以像一个juju action获取到。

juju action do kubernetes-master/0

注意:这个示例既包含curl状态来练习这个应用。这个应用自动生成“prestore”日志写到redis上,并且允许你在浏览器上可视化吞吐量。

删除集群

./kube-down.sh

或者破坏你当前的Juju环境(使用juju env命令)

juju destroy-environment --force `juju env`

更多信息

Kubernetes的分支和包可以在github.com的kubernetes项目中找到:

云兼容

Juju运行在本地和各种公共云提供商。Juju当前和Amazon Web ServiceWindows AzureDigitalOceanGoogle Compute EngineHP Public CloudJoyentLXC,任何OpenStack部署,Vagrant,和 Vmware vSphere

如果你没有在多个云列表看到你比较喜欢的云供应商,可以配置为手动配置

Kubernetes包已经在GCE和AWS上测试,使用1.0.0版本验证通过。